<?php

namespace TinyFramework\Validation\Rule;

/**
 * ISO-3166-1 Alpha-3
 * @link https://de.wikipedia.org/wiki/ISO-3166-1-Kodierliste
 * document.querySelectorAll('.jquery-tablesorter tbody tr td:nth-child(3)').forEach(e => console.log(e.innerHTML));
 */
class CountryCodeAplha3Rule extends RuleAwesome
{
    private array $countryCodes = [
        'AFG',
        'EGY',
        'ALA',
        'ALB',
        'DZA',
        'ASM',
        'VIR',
        'AND',
        'AGO',
        'AIA',
        'ATA',
        'ATG',
        'GNQ',
        'ARG',
        'ARM',
        'ABW',
        'ASC',
        'AZE',
        'ETH',
        'AUS',
        'BHS',
        'BHR',
        'BGD',
        'BRB',
        'BLR',
        'BYS',
        'BEL',
        'BLZ',
        'BEN',
        'BMU',
        'BTN',
        'BOL',
        'BES',
        'BIH',
        'BWA',
        'BVT',
        'BRA',
        'VGB',
        'IOT',
        'BRN',
        'BGR',
        'BFA',
        'BUR',
        'BDI',
        'CHL',
        'CHN',
        'CPT',
        'COK',
        'CRI',
        'CUW',
        'DNK',
        'DDR',
        'DEU',
        'DGA',
        'DMA',
        'DOM',
        'DJI',
        'ECU',
        'CIV',
        'SLV',
        'ERI',
        'EST',
        'SWZ',
        'CEE',
        'EEC',
        'FLK',
        'FRO',
        'FJI',
        'FIN',
        'FRA',
        'FXX',
        'GUF',
        'PYF',
        'ATF',
        'GAB',
        'GMB',
        'GEO',
        'GHA',
        'GIB',
        'GRD',
        'GRC',
        'GRL',
        'GLP',
        'GUM',
        'GTM',
        'GGY',
        'GIN',
        'GNB',
        'GUY',
        'HTI',
        'HMD',
        'HND',
        'HKG',
        'IND',
        'IDN',
        'IMN',
        'IRQ',
        'IRN',
        'IRL',
        'ISL',
        'ISR',
        'ITA',
        'JAM',
        'JPN',
        'YEM',
        'JEY',
        'JOR',
        'YUG',
        'CYM',
        'KHM',
        'CMR',
        'CAN',
        'CPV',
        'KAZ',
        'QAT',
        'KEN',
        'KGZ',
        'KIR',
        'CCK',
        'COL',
        'COM',
        'COD',
        'COG',
        'PRK',
        'KOR',
        'HRV',
        'CUB',
        'KWT',
        'LAO',
        'LSO',
        'LVA',
        'LBN',
        'LBR',
        'LBY',
        'LIE',
        'LTU',
        'LUX',
        'MAC',
        'MDG',
        'MWI',
        'MYS',
        'MDV',
        'MLI',
        'MLT',
        'MAR',
        'MHL',
        'MTQ',
        'MRT',
        'MUS',
        'MYT',
        'MEX',
        'FSM',
        'MDA',
        'MCO',
        'MNG',
        'MNE',
        'MSR',
        'MOZ',
        'MMR',
        'NAM',
        'NRU',
        'NPL',
        'NCL',
        'NZL',
        'NTZ',
        'NIC',
        'NLD',
        'ANT',
        'NER',
        'NGA',
        'NIU',
        'MNP',
        'MKD',
        'NFK',
        'NOR',
        'OMN',
        'AUT',
        'TLS',
        'PAK',
        'PSE',
        'PLW',
        'PAN',
        'PNG',
        'PRY',
        'PER',
        'PHL',
        'PCN',
        'POL',
        'PRT',
        'PRI',
        'REU',
        'RWA',
        'ROU',
        'RUS',
        'SLB',
        'BLM',
        'MAF',
        'ZMB',
        'WSM',
        'SMR',
        'STP',
        'SAU',
        'SWE',
        'CHE',
        'SEN',
        'SRB',
        'SCG',
        'SYC',
        'SLE',
        'ZWE',
        'SGP',
        'SXM',
        'SVK',
        'SVN',
        'SOM',
        'SUN',
        'ESP',
        'LKA',
        'SHN',
        'KNA',
        'LCA',
        'SPM',
        'VCT',
        'ZAF',
        'SDN',
        'SGS',
        'SSD',
        'SUR',
        'SJM',
        'SYR',
        'TJK',
        'TWN',
        'TZA',
        'THA',
        'TGO',
        'TKL',
        'TON',
        'TTO',
        'TAA',
        'TCD',
        'CZE',
        'CSK',
        'TUN',
        'TUR',
        'TKM',
        'TCA',
        'TUV',
        'UGA',
        'UKR',
        'HUN',
        'UMI',
        'URY',
        'UZB',
        'VUT',
        'VAT',
        'VEN',
        'ARE',
        'USA',
        'GBR',
        'VNM',
        'WLF',
        'CXR',
        'ESH',
        'ZAR',
        'CAF',
        'CYP',
    ];

    public function getName(): string
    {
        return 'countrycode3';
    }

    public function validate(array $attributes, string $name, ...$parameters): array|bool|null
    {
        $countryCode = $attributes[$name] ?? null;

        if (in_array($countryCode, $this->countryCodes, true)) {
            return null;
        }

        return [$this->translator->trans('validation.countrycode3', ['attribute' => $this->getTransName($name)])];
    }
}
